Protobuf |
您所在的位置:网站首页 › protobuf3 parsefromarray › Protobuf |
Protobuf简介
ProtoBuf在网络通信、通用数据交换等场景的效率、兼容性等方面非常出色。 介绍 protocol buffers 是一种语言无关、平台无关、可扩展的序列化结构数据的方法,它可用于(数据)通信协议、数据存储等。支持 Java、C++、Python 等多种语言,支持多个平台。 你可以定义数据的结构,然后使用特殊生成的源代码轻松的在各种数据流中使用各种语言进行编写和读取结构数据。你甚至可以更新数据结构,而不破坏由旧数据结构编译的已部署程序。 特点 序列化将结构数据或对象转换成能够被存储和传输(例如网络传输)的格式,同时应当要保证这个序列化结果在之后(可能在另一个计算环境中)能够被重建回原来的结构数据或对象。可以更新数据结构,而不影响和破坏原有的旧程序 Protobuf编译 提示:这里提供本篇文章编译好的库,可在Vs2017下直接使用。 Protobuf-3.19.1-编译库可直接使用 下载Protobuf https://github.com/google/protobuf/releases![]() ![]() 2、接着点击下图2 按钮选择编译生成目录。 3、接着点击下图3 编译,选择编译器与生成的平台版本,点击Finish 4、接着下图 框1,这里配置为Debug、Release版本 框2:建议勾选。 若不勾选则不会在后面生成dll,并且运行时库位MT、MTd。 若勾选则会生成dll,并且试运行时库为MD,MDd。 产生库 使用CMake第二步选择的Vs版本软件打开编译出来的工程ALL_BUILD.vcxproj。 或直接点击CMake软件"Open Project"按钮。 如下图,只进行编译红色线框选的工程。 编译OK的库 提示:这里提供本篇文章编译好的库,可在Vs2017下直接使用。 《Protobuf-3.19.1-编译库可直接使用》 Protobuf使用 1、创建.proto文件、.bat文件 (4)、编写序列化并udp传输 // 发送端 void ProtobufTest_A::on_sendButton_A_clicked() { // 单播 // qint64 len = mSocket->writeDatagram(ui->textEdit->toPlainText().toUtf8(),QHostAddress("192.168.137.1"),6677); //组播ip地址范围:224.0.0.0-239.255.255.255 //qint64 len = mSocket->writeDatagram(ui->textEdit->toPlainText().toUtf8(),QHostAddress("224.0.0.100"),6677); //广播 //qint64 len = mSocket->writeDatagram(ui->textEdit->toPlainText().toUtf8(), QHostAddress::Broadcast, 6677); // 序列化前初始值 (注意:std::string 必须转为utf8,否则异常) tutorial::ProtobufTest protobufTest; protobufTest.set_id(ui.port_A->text().toInt()); protobufTest.set_name(ui.ip_A->text().toUtf8().data()); protobufTest.set_email(ui.sendTxt_A->text().toUtf8().data()); // 获取长度 unsigned short protobufTestLength = protobufTest.ByteSize() + 1; // 存储序列化buf char *buf = nullptr; buf = new char[protobufTestLength]; memset(buf, 0, protobufTestLength); // 序列化 protobufTest.SerializeToArray(buf, protobufTestLength); // udp发送(UdpSocket_A为QUdpSocket) UdpSocket_A->writeDatagram(buf, protobufTestLength, QHostAddress(ip_B), port_B); // 释放序列化buf if (buf) delete buf; buf = nullptr; } // 接收端 void ProtobufTest_A::readyRead() { QByteArray array; // UdpSocket_A为QUdpSocket array.resize(UdpSocket_A->bytesAvailable()); if (array.size()) { // 接收消息 UdpSocket_A->readDatagram(array.data(), array.size()); tutorial::ProtobufTest protobufTest; // 反序列化 protobufTest.ParseFromArray(array.data(), array.size()); // 显示 ui.receiveTxt_A->append("id:\t" + QString::number(protobufTest.id())); ui.receiveTxt_A->append("name:\t" + QString(protobufTest.name().c_str())); ui.receiveTxt_A->append("email:\t" + QString(protobufTest.email().c_str()) + '\n'); } } (5)、查看结果 源码 获取方式一:CSDN积分下载 获取方式二:扫描下方微信公众号,回复 “101363526” ,立即获取源码链接。 关注 笔者 - jxd 微信公众号搜索 “码农总动员” 或 微信扫描下方二维码,了解更多你不知道的XX,O(∩_∩)O |
CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3 |